package main

import (
	"encoding/json"
	"fmt"
	"net"
	"os"
)

func main() {

	listener, e := net.Listen("tcp", "127.0.0.1:8080")

	errHandler(e)

	for ; ; {

		conn, e := listener.Accept()

		errHandler(e)

		go connHandler(conn)
	}

}

func connHandler(conn net.Conn) {

	fmt.Printf("来自客户度 %s \n", conn.RemoteAddr())

	filePath := "C:\\Users\\55219\\Desktop\\"

	var fileName string

	strMsg := make([] byte, 1024*4)

	mapMsg := make(map[string]string, 1)

	//第一次读取文件信息
	n, err := conn.Read(strMsg)

	if err == nil {

		json.Unmarshal(strMsg[0:n], &mapMsg)

		if mapMsg["fileName"] != "" {

			fileName = mapMsg["fileName"]

			filePath = filePath + fileName
		}

		fmt.Println("接收到客户端端信息: ", mapMsg)

		mapMsg = make(map[string]string, 1)

		mapMsg["status"] = "200"

		bytes, err := json.Marshal(mapMsg)

		errHandler(err)

		//创建文件
		file, err := os.OpenFile(filePath, os.O_RDONLY|os.O_CREATE|os.O_WRONLY, 438)

		//告诉客户端我已经准备好了,可以开始发送文件
		conn.Write(bytes)

		fmt.Println("向客户度应答:", mapMsg)

		errHandler(err)

		fileBody := make([] byte, 1024*8)

		for ; ; {

			i, err := conn.Read(fileBody)

			fmt.Println("i =======", i)

			if err == nil {

				//判断客户端是否发送完毕,通知客户端接收完成
				if i == 7 && string(fileBody[0:i]) == "SEND_OK" {

					conn.Write([] byte("RECEIVE_OK"))
				}

				file.Write(fileBody[0:i])

				fmt.Println("写文件 : ", i)

			} else if err != nil {

				switch err.(type) {

				//如果客户端断开连接,我也关闭连接
				case *net.OpError:

					fmt.Println("断开连接 err : ", err)

					return
				}

				fmt.Println("file.Write err : ", err)
			}

		}
	}

	defer conn.Close()

}

func errHandler(err error) {

	if err != nil {

		fmt.Println(err)
	}
}
